import type { Router, RouteRecordRaw } from 'vue-router'
import { useAuthStore } from '@/stores/auth'
import { getToken } from '@/utils/storage'
import { asyncRoutes } from '../index'

// 白名单路由（不需要登录即可访问）
const whiteList = ['/login', '/404']

// 根据用户权限过滤路由
function filterAsyncRoutes(routes: RouteRecordRaw[], permissions: string[]): RouteRecordRaw[] {
  const res: RouteRecordRaw[] = []

  routes.forEach(route => {
    const tmp = { ...route }
    // 检查是否有权限访问该路由
    if (hasPermission(permissions, tmp)) {
      // 如果有子路由，递归过滤
      if (tmp.children) {
        tmp.children = filterAsyncRoutes(tmp.children, permissions)
      }
      res.push(tmp)
    }
  })

  return res
}

// 检查用户是否有权限访问路由
function hasPermission(permissions: string[], route: RouteRecordRaw): boolean {
  // 如果路由没有设置权限控制，则视为可访问
  if (!route.meta?.permissions) {
    return true
  }

  // 如果用户有超级管理员权限，可以访问所有路由
  if (permissions.includes('*')) {
    return true
  }

  // 如果路由设置了权限要求，则需要检查用户权限
  return permissions.some(permission => 
    route.meta?.permissions?.includes(permission)
  )
}

// 动态添加路由
async function addRoutes(router: Router, routes: RouteRecordRaw[]) {
  routes.forEach(route => {
    if (!router.hasRoute(route.name as string)) {
      router.addRoute(route)
    }
  })
}

export function setupAuthGuard(router: Router) {
  let hasAddedRoutes = false // 标记是否已经添加过路由

  router.beforeEach(async (to, from, next) => {
    // 获取token
    const token = getToken()
    const authStore = useAuthStore()
    
    // 判断是否有token
    if (token) {
      if (to.path === '/login') {
        // 已登录且要跳转的页面是登录页，重定向到首页
        next({ path: '/dashboard' })
      } else {
        // 判断用户信息和路由是否已加载
        if (hasAddedRoutes && authStore.userInfo && authStore.permissions.length > 0) {
          // 如果已经加载过路由且存在用户信息和权限，直接放行
          next()
        } else {
          try {
            // 获取用户信息
            await authStore.fetchUserInfo()
            
            if (!hasAddedRoutes) {
              // 根据用户权限过滤可访问路由
              const accessRoutes = filterAsyncRoutes(asyncRoutes, authStore.permissions)
              
              // 动态添加可访问路由
              accessRoutes.forEach(route => {
                router.addRoute(route)
              })
              
              // 标记已添加路由
              hasAddedRoutes = true
              
              // 重新导航到目标路由，以确保新添加的路由生效
              // 如果是根路径，直接导航到 dashboard
              if (to.path === '/') {
                next({ path: '/dashboard', replace: true })
              } else {
                // 确保路由已经被添加后再跳转
                // 使用 replace: true 避免在历史记录中留下冗余记录
                next({ ...to, replace: true })
              }
            } else {
              next()
            }
          } catch (error) {
            // 获取用户信息失败，可能是token过期，需要重新登录
            await authStore.logoutAction()
            next(`/login?redirect=${to.path}`)
          }
        }
      }
    } else {
      // 没有token
      if (whiteList.includes(to.path)) {
        // 在免登录白名单中，直接进入
        next()
      } else {
        // 其他没有访问权限的页面将被重定向到登录页面
        next(`/login?redirect=${to.path}`)
      }
    }
  })
} 